package br.com.swp.campestre.session;

import java.util.List;

import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.international.StatusMessage;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.persistence.HibernateSessionProxy;

import br.com.swp.campestre.entity.Cidade;
import br.com.swp.campestre.entity.ClientePJ;

@Stateful
@Name("ClientePJBean")
@Scope(ScopeType.CONVERSATION)
public class ClientePJBean implements ClientePJLocal {

	@Logger
	private Log log;
	
	@In
	StatusMessages statusMessages;
	
	private String cnpj;
	
    @RequestParameter
    private Long idCliente;
    
	@In(required = true) @Out(required=false)
	private ClientePJ clientePJ;
	
    private String razaoSocial;
    
	private List<ClientePJ> clientesPJ;
	
	@PersistenceContext
	private EntityManager entityManager;

	@In(create = true, required = false)
	private HibernateSessionProxy hibernateSession;

	private Cidade cidade;

	@In(required=false , create=true)
    CidadeList cidadeList;
	
	
	@Create
	public void init() {

	}
	
	@End(beforeRedirect = false)
	public void clientePJBean() throws IllegalStateException {

		entityManager.persist(clientePJ);

		//entityManager.persist(clientePJ);
		// Notifica o sucesso da operacao
		// statusMessages.add("#{messages.sucessoPreInscricao}");

	}

//	@Begin(join = true)
	@End
	public void novoCliente() throws IllegalStateException {
		//entityManager.persist(clientePJ);
		Criteria crt = hibernateSession.createCriteria(ClientePJ.class);
		
		if (clientePJ.getCnpj() != null && !clientePJ.getCnpj().equals("")) {
			crt.add(Restrictions.eq("cnpj", clientePJ.getCnpj()));
		}
		
		if ((clientePJ.getCnpj() != null && !clientePJ.getCnpj().equals(""))) {
			clientesPJ = crt.list();
		}
		
		if(clientesPJ != null && clientesPJ.size() >= 1 && clientePJ.getId() == null ){
			statusMessages.add(StatusMessage.Severity.ERROR, "Cliente jah foi cadastrado");
		} else {
//			Cidade c = entityManager.find(Cidade.class, clientePJ.getCidade().getId());
//	    	clientePJ.setCidade(c);
	    	hibernateSession.saveOrUpdate(clientePJ);
			statusMessages.add(StatusMessage.Severity.INFO, "Cliente cadastrado com sucesso");

//			clientePJ = entityManager.merge(clientePJ);
//			entityManager.persist(clientePJ);
//			statusMessages.add(StatusMessage.Severity.INFO, "Cliente cadastrado com sucesso");

		}
		
	}
	
	@Begin(join=true)
	public void pesquisaCliente() {
		clientePJ = null;
//		List<ClientePJ> clientesPJ = null;

		Criteria crt = hibernateSession.createCriteria(ClientePJ.class);

		if (cnpj != null && !cnpj.equals("")) {
			crt.add(Restrictions.eq("cnpj", cnpj));
		}

		if (razaoSocial != null && !razaoSocial.equals("")) {
			crt.add(Restrictions.like("razaoSocial", "%"+razaoSocial+"%").ignoreCase());
		}
		
		if (cnpj != null && !cnpj.equals("") || (razaoSocial != null) ) {
			clientesPJ = crt.list();
		}
		
		
		if (clientesPJ != null && clientesPJ.size() == 1) {
			clientePJ = clientesPJ.get(0);
		} else {
			clientePJ = null;
//			statusMessages.add("Cliente nao encontrado");
		}
	}

	@Begin(join = true)
	public void editar(){
    	log.info("idCliente: " + idCliente);
    	
    	if(idCliente == null)return;
    	
    	for (ClientePJ _clientePJ : clientesPJ) {
			if(_clientePJ.getId().equals(idCliente)){
				clientePJ = _clientePJ;
				break;
			}
		}
    	
    	if(cidadeList != null && clientePJ != null && clientePJ.getCidade() != null && clientePJ.getCidade().getUf() != null){
    		cidadeList.setUf(clientePJ.getCidade().getUf());
    		cidadeList.buscaCidade(cidadeList.getUf());
    	}
	
	}

	@Destroy
	@Remove
	public void destroy() {
		cnpj = null;

	}

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public ClientePJ getClientePJ() {
		return clientePJ;
	}

	public void setClientePJ(ClientePJ clientePJ) {
		this.clientePJ = clientePJ;
	}

	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	public String getRazaoSocial() {
		return razaoSocial;
	}

	public void setClientesPJ(List<ClientePJ> clientesPJ) {
		this.clientesPJ = clientesPJ;
	}

	public List<ClientePJ> getClientesPJ() {
		return clientesPJ;
	}

	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}


}
